//原文链接：https://blog.csdn.net/ITSOK_123/article/details/124213577

//排序+双指针
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        //初始化结果向量
        vector<vector<int>> result;
        //预存数组长度
        int len = nums.size();
        //数组排序以方便处理
        sort(nums.begin(),nums.end());
        //定义循环左边界i
        for(int i=0;i<len;i++){
            if(i>0 && nums[i]==nums[i-1])continue;
            //定义循环左边第二个数jj
            for(int j=i+1;j<len;j++){
                if(j>i+1 && nums[j]==nums[j-1])continue;
                //转换为求left和right的和的子问题
                //还可以防止溢出
                int temp = target-nums[i]-nums[j];
                int left = j+1,right=len-1;
                //确定最左边两个数后求其他两个数
                while(left<right){
                    if(nums[left]+nums[right] ==temp){
                        result.push_back({nums[i],nums[j],nums[left],nums[right]});
                        //左边去重
                        while(left<right && nums[left]==nums[left+1])left++;
                        //右边去重
                        while(left<right && nums[right]==nums[right-1])right--;
                        right--;
                        left++;
                    }else if(nums[left]+nums[right] > temp) right--;
                    else left++;
                }
            }
        }
        return result;
    }
};
